Boite à outils 3 :


Une fois arrivées au stade de la bao3, nous sommes dans la situation suivante : nous disposons de fichiers textes et XML étiquetés via Cordial ou treetagger et nous souhaiterions désormais en extraire nos patrons morphosyntaxiques. Pour ce faire, trois scripts, reposant sur des méthodes différentes, nous ont été proposés.


Le premier script est celui donné par Rachid Belmouhoub. Ayant obtenu lors de la Bao2 des documents étiquetés via treetagger et structurés en XML, il nous est possible de baser notre rechercher de patrons sur l’arborescence XML.  Pour ce faire, le programme de Rachid utilise un module perl XML::LibXML. Le script fonctionne de la manière suivante :

•    Le script prend deux arguments : un fichier XML produit lors de la BAO2 et un fichier texte contenant les patrons morphosyntaxiques que l’on souhaite extraire (par exemple : NOM PRP NOM). Ces deux arguments rentrés dans la ligne de commande sont enregistrés dans des variables
•    On ouvre notre fichier de motifs qu’on va alors parcourir ligne par ligne
•    Une routine permet d’utiliser des chemins XPath (sub construit_XPath), construit selon l’information que l’on souhaite extraire. Après avoir récupéré le motif recherché, on initialise un chemin XPath ainsi qu’un tableau dont chaque élément correspond à un élément du motif recherché. C’est dans ce tableau que l’on reprend ensuite les éléments pour les intégrer à notre chemin XPath. Une fois ce chemin XPath construit, on le retourne au programme principal.
•    Une seconde routine (sub extract_pattern), utilise le chemin XPath construit lors de la première routine pour extraire notre information de notre document XML. C’est dans cette routine que sont créés nos fichiers de résultats, encodés en UTF8.  Plus précisément, le programme parcourt les nœuds du fichier XML qui correspondent à notre motif.
•    Une fois la seconde routine achevée, on récupère notre fichier de résultats. 

Script de Rachid Belmouhoub





Le second script, écrit en langage perl, est celui donné par Jean-Michel Daube. Ce script prend également en arguments un fichier texte contenant les patrons à extraire ainsi qu’un fichier texte étiqueté par Cordial.

•    Tout d’abord, le script lit ligne par ligne le fichier qui contient tous nos patrons et vérifie qu’il n’y a pas d’espaces en trop entre chaque élément du motif (par exemple, on enlèverait un blanc en trop dans NOM_ _ADJ , représenté ici par le tiret du bas). En outre, il retire tous les retours à la ligne.
•    Dans cette même boucle conditionnelle, on parcourt notre fichier contenant notre texte étiqueté par Cordial. Chaque ligne est stockée dans la variable $ligne.
•    Tant que le programme ne rencontre pas de signe de ponctuation forte ou faible, il coupe au signe de la tabulation (puisque, les résultats étiquetés par Cordial ont bien la forme d’un tableau), qui sépare chaque token. Les tokens correspondant à la classe grammaticale sont  insérés dans une liste et les tokens correspondant à notre terme sont intégrés dans une autre liste. On délaisse les formes lemmatisées.
•    En revanche, si le programme rencontre un signe de ponctuation forte ou faible, il imprime nos deux listes constituées respectivement des termes et des classes grammaticales. Ces deux listes sont ensuite transformées en scalaires via la commande join afin de pouvoir les comparer.
•    Tant que notre liste contenant nos classes grammaticales ($pos) est égale à notre terme $terme (qui est notre motif contenu dans notre fichier de motifs donné en argument au programme), alors on utilise un système d’indices basé sur le blanc, l’espace comme séparateur. On dénombre ainsi les termes se trouvant autour du blanc (le séparateur).  Une fois la comparaison faite, on peut imprimer les tokens que nous avons extraits grâce à cette méthode.

Script de Jean-Michel Daube





Le dernier script est celui conçu par Serge Fleury. Il s’agit également d’un script perl, basé sur les expressions régulières, qui ne prend qu’un seul argument, qui est notre fichier texte étiqueté par treetagger ou par cordial (le script peut en effet, s’appliquer aux deux types de fichiers, il suffit pour cela d’adapter l’expression régulière). Il faut à chaque fois modifier le script selon le type de fichier d’entrée et le patron morphosyntaxique qui nous intéresse.

•    Le programme commence par lire ligne par ligne notre fichier d’entrée. Chaque ligne est insérée dans une liste (@lignes).
•    Shift permet de lire le premier élément de notre liste, qui est une ligne et qui va être insérée dans une scalaire $ligne.
•    On vérifie ensuite que la ligne contenu dans notre scalaire $ligne correspond bien à notre expression régulière :
    Pour Cordial, étant donné que les lignes sont structurées comme un tableau, pour prendre le mot qui nous intéresse, on va demander à ce que la fin de la ligne (soit la troisième colonne, contienne NC (la classe grammaticale des noms). Si c’est le cas, on prendra le premier élément de notre ligne. Chaque élément est séparé par une tabulation (\t)
    Pour treetagger, l’expression régulière se base sur les balises. Si l’on tombe sur une ligne dont la balise type est égale à NOM, alors on prendra le contenu de la balise data. Il est important de noter que toutes les balises de notre ligne doivent justement être bel et bien sur une seule ligne et collées entre elles pour bien correspondre à notre expression régulière.
•    Chaque élément de notre patron morphosyntaxique est récupéré dans $1 et rajouté au fur et à mesure dans $sequence.
•    Une autre variable, $longueur, indique le nombre d’éléments extraits. Cela nous permettra de mesurer la longueur du patron morphosyntaxique que l’on souhaite extraire (NOM ADJ ou NOM PREP NOM) et de la vérifier.
•    Une fois les éléments de notre patron morphosyntaxique extraits, on les imprime sur le terminal. Il est aussi possible de modifier le programme afin qu’il les imprime dans un fichier de sortie, comme dans le cas des programmes précédents.
•    Nota bene : pour passer d’un élément de notre liste @lignes à un autre, on utilise shift ainsi que l’indice [0]. Dès qu’on a passé une ligne, on passe à la suivante, qui se voit attribuer cet indice et se retrouve donc en « première position » pour être lue et stockée par le programme.
Nous avons testé ces trois scripts et étudié leur fonctionnement. Pour plus d’efficacité et de rapidité, il aurait été possible de rajouter à chacun de ces scripts une routine permettant de parcourir toute l’arborescence de notre dossier contenant les fichiers étiquetés, comme dans le cas de nos scripts de la BAO2.

Script de Serge Fleury

 Voici un exemple de résultats provenant de la rubrique 3244 : résultats